//package com.liuyjy.encryptDecrypt;
//
//import com.fasterxml.jackson.core.JsonParser;
//import com.fasterxml.jackson.databind.*;
//import com.fasterxml.jackson.databind.deser.BeanDeserializer;
//import com.fasterxml.jackson.databind.deser.BeanDeserializerBase;
//import com.fasterxml.jackson.databind.deser.BeanDeserializerModifier;
//import com.fasterxml.jackson.databind.introspect.AnnotatedField;
//import com.fasterxml.jackson.databind.introspect.BeanPropertyDefinition;
//import com.fasterxml.jackson.databind.module.SimpleModule;
//import com.fasterxml.jackson.databind.ser.BeanPropertyWriter;
//import com.fasterxml.jackson.databind.ser.BeanSerializerModifier;
//
//import java.io.IOException;
//import java.util.List;
//
///**
// * @Author liuyjy
// * @Date 2025/2/20 12:27
// * @Description: 加解密模块配置
// **/
//public class CryptoModule extends SimpleModule {
//    private final CryptoProcessor processor;
//
//    public CryptoModule(CryptoProcessor processor) {
//        this.processor = processor;
//        setSerializerModifier(new CryptoSerializerModifier());
//        setDeserializerModifier(new CryptoDeserializerModifier());
//    }
//
//    /**
//     * 序列化修改器（预编译时处理）
//     */
//    private class CryptoSerializerModifier extends BeanSerializerModifier {
//        @Override
//        public List<BeanPropertyWriter> changeProperties(SerializationConfig config,
//                                                         BeanDescription beanDesc, List<BeanPropertyWriter> beanProperties) {
//            for (BeanPropertyWriter writer : beanProperties) {
//                Encrypt encrypt = writer.getAnnotation(Encrypt.class);
//                if (encrypt != null) {
//                    writer.assignSerializer(new CryptoSerializer(encrypt, processor));
//                }
//            }
//            return beanProperties;
//        }
//    }
//
//    /**
//     * 反序列化修改器（预编译时处理）
//     */
//    private class CryptoDeserializerModifier extends BeanDeserializerModifier {
//        @Override
//        public JsonDeserializer<?> modifyDeserializer(DeserializationConfig config,
//                                                      BeanDescription beanDesc, JsonDeserializer<?> deserializer) {
//            List<BeanPropertyDefinition> props = beanDesc.findProperties();
//            for (BeanPropertyDefinition prop : props) {
//                if (prop.getField().hasAnnotation(Decrypt.class)) {
//                    return new CryptoBeanDeserializer((BeanDeserializerBase) deserializer);
//                }
//            }
//            return deserializer;
//        }
//
//        /**
//         * 处理嵌套对象的Bean反序列化
//         */
//        private class CryptoBeanDeserializer extends BeanDeserializer {
//            public CryptoBeanDeserializer(BeanDeserializerBase src) {
//                super(src);
//            }
//
//            @Override
//            public Object deserialize(JsonParser p, DeserializationContext ctxt)
//                    throws IOException {
//                Object bean = super.deserialize(p, ctxt);
//                // 递归处理嵌套字段
//                processNestedFields(bean, ctxt);
//                return bean;
//            }
//
//            private void processNestedFields(Object bean, DeserializationContext ctxt) {
//                // 使用 getBeanDescription() 方法获取 BeanDescription 对象
//                BeanDescription beanDesc = ctxt.getConfig().introspect(ctxt.constructType(bean.getClass()));
//                List<BeanPropertyDefinition> props = beanDesc.findProperties();
//                for (BeanPropertyDefinition prop : props) {
//                    AnnotatedField field = prop.getField();
//                    Decrypt decrypt = field.getAnnotation(Decrypt.class);
//                    if (decrypt != null) {
//                        try {
//                            field.fixAccess(true);
//                            Object value = field.getValue(bean);
//                            if (value != null) {
//                                Object decrypted = new CryptoDeserializer(decrypt, processor)
//                                        .convertValue(value.toString(), field.getType());
//                                field.setValue(bean, decrypted);
//                            }
//                        } catch (Exception e) {
//                            throw new RuntimeException(e);
//                        }
//                    }
//                }
//            }
//        }
//    }
//}
